package com.hibernate.session ;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import com.hibernate.domain.Account;
import com.hibernate.utils.HibernateUtils;

/**
 * session的创建方式测试类
 * @author LC
 *
 */
public class SessionTest extends HibernateUtils{
	
	/**
	 * sessionFactory.openSession()
	 * 		每次都会创建一个新的session
	 */
	@Test
	public void testOpenSession_1(){
		sessionFactory.openSession();
	}
	
	/**
	 * sessionFactory.getCurrentSession()
	 * 获取当前线程中的session
	 * 		1、从当前线程中(ThreadLocal)中，把session提取出来
	 *		2、如果第一步失败，则调用openSession方法创建一个session
	 *		3、接着第二步，把session放入到threadlocal中
	 *		4、走第一步
	 *	说明：
	 *		1、crud操作必须在事务的环境下运行。
	 *		2、事务提交，session自动关闭。
	 *		3、这种方式强制把事务和session绑定在一起了。
	 */
	@Test
	public void testOpenSession_2(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Account account = (Account)session.get(Account.class, 1L);
		transaction.commit();//事务提交，session关闭
	}
}
